package com.xbh.Book.web;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

/**
 * @program: JavaWebExer
 * @description:
 * 在进行项目开发时，有时候用户的一个操作就会新增一个Servlet来处理相应的操作，造成Servlet的冗余现象
 * 为了解决Servlet太多的造成冗余的现象，我们只需定义一个BaseServlet来获取用户想要调用的方法名，
 * 通过方法的名称反射来调用该类的其他方法。这样原来定义的很多个Servlet就不再需要了。
 *
 * ************************
 * 优化、这做法虽然不再需要创建过多的Servlet，但效率低，每增加一个方法就需要修改代码，增加if判断，无疑这样做会造成代码耦合性高，不利于开发。
 * 对于上面这两种问题，可以创建一个BaseServlet来解决，那就是在BaseServlet里面，继承HttpServlet，重写serice方法，
 * 通过反射来调用当前类中已有的方法，在后面的开发中，创建的Servlet(其实是类)，只需要继承这个BaseServlet即可，
 * 而继承了BaseServlet的子类不管增加方法，还是删除方法，BaseServlet都不需要修改源代码，这样就可以大大减少代码量，简化了操作。
 *
 * @author: 许宝华
 * @create: 2021-04-22 09:50
 */

public abstract class BaseServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");
        String action = req.getParameter("action");

        try {
            //获取action业务鉴别字符串，获取相应的业务，方法反射对象
            Method declaredMethod = this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
            //调用目标业务方法
            declaredMethod.invoke(this,req,resp);

        } catch (Exception e) {
            e.printStackTrace();
            throw  new RuntimeException(e);//把异常抛到最外面，不然filter接收不到异常，就无法执行回滚操作
        }
    }
}
